# !/usr/bin/env python
# -*- coding: utf-8 -*-
'''
# Adriano Leal
# 11951
'''
import aStar
import time
import image
import cv2
import sys


class Main:
    '''
    inicia o programa.
    Contém os métodos de escrita dos ficheiros da aplicação.
    '''

    star = None

    def __init__(self):
        self.star = aStar.AStar()
        self.intermediate = 0
        self.count = 0

    def dataFile(self, name, lista):
        '''
        Grava em um ficheiro as coordenadas dos pontos onde o grafico e desenhado.
        @param name = Nome do ficheiro a ser criado. Neste ficheiro será escrito as coordenadas
                      dos pontos onde irá passar o gráfico.
        @param lista = Contem a rota (pontos) por onde será desenhada uma linha.
        '''
        data = open(name, 'w')
        for coord in lista:
            data.writelines((str(coord[0]), ', ', str(coord[1]), '\n'))
        data.close()


    def iteration(self):
        '''
        Inicializa o algoritmo um determinado número de vezes.
        @return = retorna a rota por onde passa a linha do grafico.
        '''
        global times
        times = []
        route = self.star.aStar(4, self.star.P2)  # Carregar a lista.
        parts = route[self.intermediate]
        t = time.time()  # inicia a contagem do tempo de um caminho criado.
        while (self.star.P2 >= parts):
            for i in xrange(30):
                self.star.aStar(4, parts)  # parametro passados, número de direções possiveis, intervalo da rota.
                if i == 9:
                    # adiciona os valores intermédiarios  e a média do que leva para fazer 10 ciclos.
                    times.append((self.intermediate, ((time.time() - t) / 10)))
                    sys.stdout.write("\rProgresso: %d%%" % (self.count * 100 / 29))
                    sys.stdout.flush()
            self.count += 1
            self.intermediate += 20
            parts = route[self.intermediate]
        self.iterationTime()
        return route


    def iterationTime(self):
        '''
        Escreve em um ficheiro os tempos decorridos de cada iteração.
        estes tempos servem para a criação de um gráfico.
        '''
        dataTime = open("time.txt", 'w')
        for t in times:
            a = str(t)
            a = a.replace('(', '').replace(')', '')
            dataTime.writelines("%s\n" % a)
        dataTime.close()


if __name__ == '__main__':
    main = Main()
    op = image.OpenImage('peppersgrad.pgm')
    aStar.AStar.img = op.img
    route = main.iteration()
    op.route = route
    main.dataFile('data.txt', route)
    op.drawImage()
    star = aStar.AStar
    cv2.imshow('EDA1314 Adriano Leal n11951', op.img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
